let ws: WebSocket
let reconnectAttempts = 0 // 重连次数
let reconnectInterval = 1000 // 重连间隔时间
let maxReconnectAttempts = 5 // 最大重连次数
let isManualClose = false // 是否手动关闭
let heartBeatIntervalTime = 1000*10 // 心跳间隔时间
let heartBeatInterval: NodeJS.Timeout | null = null

/**
 * 检查浏览器是否支持WebSocket
 * @returns 是否支持
 */
function checkWebSocketSupport() {
  if( typeof WebSocket === 'undefined') {
    console.error('WebSocket is not supported in this browser')
    return false
  }
  return true
}
const wsUrl = import.meta.env.VITE_WS_URL
const protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://'
const baseUrl = protocol + wsUrl

/**
 * 重连
 */
const reconnect = () => {
  reconnectAttempts++
  if(reconnectAttempts > maxReconnectAttempts || isManualClose) {
    if(isManualClose) {
      console.log('手动关闭连接，不进行重连')
    } else {
      console.error('重连失败，最大重连次数为：' + maxReconnectAttempts)
    }
    return
  }
  setTimeout(() => {
    initWebSocket()
  }, reconnectInterval)
}

function startHeartBeat() {
  heartBeatInterval = setInterval(() => {
    if(ws.readyState === WebSocket.OPEN) {
      ws.send('ping')
      console.log('发送心跳')
      // 发送心跳后，设置pong响应超时检测，如果超时，则重连
    }
  }, heartBeatIntervalTime)
  return heartBeatInterval
}

function stopHeartBeat() {
  if(heartBeatInterval) {
    clearInterval(heartBeatInterval)
  }
  heartBeatInterval = null
}
/**
 * 初始化WebSocket连接
 * @param url 连接地址
 * @returns 是否成功
 */
function initWebSocket() {
  if(!checkWebSocketSupport()) {
    return new Error('WebSocket is not supported in this browser')
  }
  // 创建WebSocket连接
  ws = new WebSocket(baseUrl)
  // 连接成功回调
  ws.onopen = () => {
    console.log('连接成功')
    reconnectAttempts = 0
    startHeartBeat()
  }
  // 接收消息回调
  ws.onmessage = (event) => {
    console.log(event.data)
  }
  // 连接关闭回调
  ws.onclose = () => {
    console.log('连接关闭')
    reconnect()
    stopHeartBeat()
  }
  // 连接错误回调
  ws.onerror = (error) => {
    console.log(error)
  }
}

/**
 * 关闭WebSocket连接
 */
function closeWebSocket() {
  isManualClose = true
  stopHeartBeat()
  ws.close()
}
export {
  initWebSocket,
  closeWebSocket
}
// websocket
// 1. 检查浏览器是否支持WebSocket :typeof
// 2. 创建WebSocket连接 new WebSocket(baseUrl)
// 3. 连接成功回调 onopen 重连次数清零，开始心跳,等待pong响应
// 4. 接收消息回调 onmessage 处理消息，心跳超时检测。如果超时，则重连。如果pong响应，则重连次数清零。
// 5. 连接关闭回调 onclose 重连，心跳停止
// 6. 连接错误回调 onerror 重连，心跳停止
// 7. 重连 重连次数+1，如果重连次数大于最大重连次数，则停止重连。如果重连次数小于最大重连次数，则开始心跳,等待pong响应
// 8. 心跳 发送ping，等待pong响应。如果pong响应，则重连次数清零。如果超时，则重连
// 9. 心跳超时检测 如果pong响应，则重连次数清零。如果超时，则重连
// 10. 手动关闭连接 closeWebSocket 重连次数清零，心跳停止
